package com.ryskoo.util;

import com.github.tobato.fastdfs.domain.StorePath;
import com.github.tobato.fastdfs.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * FastDFS文件上传下载工具类
 * 
 * @author qyc
 *
 */
@Component(value = "FastDFSClient")
public class FastDFSClient implements Serializable {

	@Autowired
	private FastFileStorageClient fdfsStorageClient;

	/**
	 * FastDFS上传文件
	 * 
	 * @param file
	 *            文件对象
	 * @return 文件路径 （说明：不是全路径，未加IP）
	 * @throws IOException
	 */
	public String uploadFile(MultipartFile file) throws IOException {
		String fullPath = "";
		// 1.校验参数
		if (file == null) {
			return fullPath;
		}
		// 2.文件路径
		fullPath = this.fdfsUploadFile(file);
		return fullPath;
	}

	/**
	 * FastDFS批量上传文件
	 * 
	 * @param files
	 *            文件对象数组
	 * @return 文件路径 （说明：不是全路径，未加IP）
	 * @throws IOException
	 */
	public List<String> batchUploadFile(MultipartFile[] files)
			throws IOException {
		List<String> fullPaths = new ArrayList<String>();
		// 1.校验参数
		if (files == null || files.length <= 0) {
			return fullPaths;
		}
		String fullPath = "";
		// 2.遍历文件数组
		for (MultipartFile file : files) {
			if (file == null) {
				continue;
			}
			// 3.文件路径
			fullPath = this.fdfsUploadFile(file);
			if (StringUtils.isBlank(fullPath)) {
				continue;
			}
			fullPaths.add(fullPath);
		}
		return fullPaths;
	}

	/**
	 * 私有方法： 公共上传文件FastDFS
	 * 
	 * @param file
	 *            文件对象
	 * @return 文件路径
	 * @throws IOException
	 */
	private String fdfsUploadFile(MultipartFile file) throws IOException {
		// 1.上传文件到FastDFS
		StorePath storePath = fdfsStorageClient.uploadFile(
				file.getInputStream(), file.getSize(),
				FilenameUtils.getExtension(file.getOriginalFilename()), null);
		// 2.文件路径
		String fullPath = storePath.getFullPath();
		return fullPath;
	}

	/**
	 * FastDFS删除文件
	 * 
	 * @param fullPath
	 *            文件路径 （说明：不是全路径，未加IP）
	 */
	public void deleteFile(String fullPath) {
		// 删除文件
		fdfsStorageClient.deleteFile(fullPath);
	}

	/**
	 * FastDFS下载文件
	 * 
	 * @param fullPath
	 *            文件路径 （说明：不是全路径，未加IP）
	 * @return 输入流
	 */
	public InputStream downloadFile(String fullPath) {
		byte[] byteStr = null;
		InputStream ins = null;
		if (StringUtils.isBlank(fullPath)) {
			return ins;
		}
		try {
			// 第一个参数：组名；第二个参数：文件名；第三个参数：真实文件名
			byteStr = fdfsStorageClient.downloadFile(fullPath.split("/")[0],
					fullPath.substring(fullPath.indexOf("/") + 1),
					new DownloadByteArray());
			ins = new ByteArrayInputStream(byteStr);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ins;
	}

	/**
	 * FastDFS上传文件
	 *
	 * @param filePath
	 *            文件绝对路径
	 * @param suffix
	 *            文件的后缀
	 * @param remove
	 *            上传后原文件是否删除
	 * @return 文件路径 （说明：不是全路径，未加IP）
	 * @throws IOException
	 */
	public String uploadFilePath(String filePath,String suffix,boolean remove) throws IOException {
		InputStream in = null;
		try{
			// 通过绝对路径url获取File
			File file = new File(filePath);
			in = new FileInputStream(file);
			// 上传本地压缩文件
			StorePath storePath = fdfsStorageClient.uploadFile(
					in, file.length() ,suffix, null);
			// 上传的压缩文件路径
			String fullPath = storePath.getFullPath();
			// 删除本地压缩文件前，先关闭流
			if(in != null){
				in.close();
			}
			if(!StringUtils.isEmpty(fullPath) && remove){
				// 删除原文件
				if(file.exists()){
					file.delete();
				}
			}
			return fullPath;
		}catch(IOException e){
			if(in != null){
				in.close();
			}
		}
		return null;
	}

}
